package com.aisile.admin.service.imp;

import cn.hutool.core.util.DesensitizedUtil;
import com.aisile.admin.mapper.AdUserMapper;
import com.aisile.admin.service.AdLoginService;
import com.aisile.common.exception.CustomExceptionThrows;
import com.aisile.model.admin.dtos.AdUserDto;
import com.aisile.model.admin.pojos.AdUser;
import com.aisile.model.common.dtos.ResponseResult;
import com.aisile.model.common.enums.AdminHttpCodeEnum;
import com.aisile.utils.common.AppJwtUtil;
import com.aisile.utils.common.BCrypt;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.mysql.fabric.HashShardMapping;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @Auther:yry
 * @Date:2024/4/25 0025
 * @VERSON:1.0
 */
@Service
public class AdLoginServiceImpl implements AdLoginService {

    @Autowired
    private AdUserMapper adUserMapper;

    @Override
    public ResponseResult login(AdUserDto dto) {
        if(dto == null){
            CustomExceptionThrows.catchAdmin(AdminHttpCodeEnum.PARAM_INVALID);
        }
        // 判断密码和用户名是否为空
        if(StringUtils.isEmpty(dto.getName()) || StringUtils.isEmpty(dto.getPassword())){
            CustomExceptionThrows.catchAdmin(AdminHttpCodeEnum.PARAM_INVALID);
        }
        // 实现登录逻辑
        // 1. 先根据用户名查询用户对象
        // 判断用户登录状态  9 的时候才能登录
        // 然后根据用户信息中的面和用户传递进来的密码进行判断 bcrypt 方式
        // 登录成功与失败
        // 成功 -- 签发jwt令牌 以及 封装用户信息
        // 反向维护 最后登录时间字段

        AdUser adUser =  adUserMapper.selectOne(Wrappers.<AdUser>lambdaQuery().eq(
                AdUser::getName,dto.getName()
        ));
        if(adUser == null){
            CustomExceptionThrows.catchAdmin(AdminHttpCodeEnum.NEED_USERNAME_LOGIN);
        }
        // 判断状态
        if(adUser.getStatus() != 9){
            CustomExceptionThrows.catchAdmin(AdminHttpCodeEnum.NEED_ADMIND);
        }
        // 用户名行了，状态也行了，看看密码行不行
        if(!BCrypt.checkpw(dto.getPassword(),adUser.getPassword())){
            CustomExceptionThrows.catchAdmin(AdminHttpCodeEnum.LOGIN_PASSWORD_ERROR);
        }
        // 反向维护登录时间
        adUser.setLoginTime(new Date());
        adUserMapper.updateById(adUser);
        // 签发token
        String token =  AppJwtUtil.getToken(adUser.getId().longValue());
        // 数据脱敏
        adUser.setEmail(DesensitizedUtil.email(adUser.getEmail()));
        adUser.setPhone(DesensitizedUtil.mobilePhone(adUser.getPhone()));
        adUser.setPassword("******");

        // 封装前端需要的信息  token  aduser
        Map<String,Object> resultMap = new HashMap<>();
        resultMap.put("token",token);
        resultMap.put("user",adUser);

        return ResponseResult.okResult(resultMap);
    }
}
